package com.kamistoat.meimeistore.moduleslocalfile.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.io.File;

/**
 * 老熟人 WebMvcConfigurer
 * 这里就是 FileConfig 中讲的，对请求进行拦截匹配，如果是文件资源请求，则将请求重写为文件资源所在的绝对路径。
 *
 * P.S. 该设置只对使用 纯粹的本地持久化算法 生效。
 * 当使用 Minio或者FastDfs时并不生效，因为压根请求就不是这个项目
 */
@Configuration
public class LocalResourcesConfig implements WebMvcConfigurer {

    @Autowired
    FileConfig fileConfig;

    /**
     * 上传文件存储在本地的根路径。示例: /home/kamistoat/meimeistore/
     */
    private final String localFileBaseDir = fileConfig.getBaseDir();

    /**
     * 文件资源请求前缀。示例: /statics
     */
    private final String localFilePrefix = fileConfig.getPrefix();

    /**
     * 添加资源映射器(该方法看名字也直到，只能用来添加资源映射)
     *
     * @param registry
     * @see ResourceHandlerRegistry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        /**
         * 如果请求是 /statics/**，例如 http://192.168.56.10/statics/2022/09/09/testPic_05f12631-cb39-40ec.png，
         * 到达后端之后就是 /statics/2022/09/09/testPic_05f12631-cb39-40ec.png，就会被这里的资源映射器匹配上，
         * 于是请求就会被改写成 file:/home/kamistoat/meimeistore/2022/09/09/testPic_05f12631-cb39-40ec.png。
         * 这是一个纯粹的资源请求
         */
        registry.addResourceHandler(localFilePrefix + "/**")
                .addResourceLocations("file:" + localFileBaseDir + File.separator);
    }


    /**
     * 开启跨域
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        // 设置允许跨域的路由
        registry.addMapping(localFilePrefix + "/**")
                // 设置允许跨域请求的域名
                .allowedOrigins("*")
                // 设置允许的方法
                .allowedMethods("GET");
    }
}
